#include <fcntl.h>
#include <assert.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <stddef.h>
#include <unistd.h>

int main() {
    // 创建共享内存对象
    int fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0644);
    assert(fd > 0);
    // 设置共享内存大小
    ftruncate(fd, 4096);

    // 映射共享内存到进程地址空间
    void *ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    assert(ptr != MAP_FAILED);

    pid_t pid = fork();
    if (pid == 0) {
        sprintf(ptr, "Hello World\n");
    } else {
        int pid = waitpid(-1, NULL, 0);
        assert(pid > 0);
        char buf[1024] = {0};
        read(fd, buf, sizeof buf);   
        printf("buf = %s", buf);
    }
    // 解除共享内存映射
    munmap(ptr, 4096);
    close(fd);
    // 删除共享内存对象
    shm_unlink("my_shm");
    return 0;
}